import java.util.Scanner;

/**
 * 通过软盘拷贝文件
 * 
 * 题目描述

有一名科学家想要从一台古董电脑中拷贝文件到自己的电脑中加以研究。

但此电脑除了有一个3.5寸软盘驱动器以外，没有任何手段可以将文件持贝出来，而且只有一张软盘可以使用。

因此这一张软盘是唯一可以用来拷贝文件的载体。

科学家想要尽可能多地将计算机中的信息拷贝到软盘中，做到软盘中文件内容总大小最大。

已知该软盘容量为1474560字节。文件占用的软盘空间都是按块分配的，每个块大小为512个字节。一个块只能被一个文件使用。拷贝到软盘中的文件必须是完整的，且不能采取任何压缩技术。

输入描述
第1行为一个整数N，表示计算机中的文件数量。1 ≤ N ≤ 1000.
接下来的第2行到第N+1行(共N行)，每行为一个整数，表示每个文件的大小Si，单位为字节。

0 ≤ i < N,0 ≤ Si

输出描述
科学家最多能拷贝的文件总大小

备注
为了充分利用软盘空间，将每个文件在软盘上占用的块记录到本子上。即真正占用软盘空间的只有文件内容本身。

用例
输入	3
737270
737272
737288
输出	1474542
说明	3个文件中，每个文件实际占用的大小分别为737280字节、737280字节、737792字节。
只能选取前两个文件，总大小为1474542字节。虽然后两个文件总大小更大且未超过1474560字节，但因为实际占用的大小超过了1474560字节，所以不能选后两个文件。
输入	6
400000
200000
200000
200000
400000
400000
输出	1400000
说明	
从6个文件中，选择3个大小为400000的文件和1个大小为200000的文件，得到最大总大小为1400000。
也可以选择2个大小为400000的文件和3个大小为200000的文件，得到的总大小也是1400000

 */
/*
 * 
 * 题目解析
本题可以当成01背包问题来求解。

关于01背包问题，可以看：算法设计 - 01背包问题_01背包算法_伏城之外的博客-CSDN博客

关于01背包问题的滚动数组优化，可以看：算法设计 - 01背包问题的状态转移方程优化，以及完全背包问题_01背包问题状态转移方程_伏城之外的博客-CSDN博客

本题中：

软盘容量为1474560字节  → 背包承重
文件  →  物品
文件容量  → 物品价值
ceil(文件容量 / 512.0) * 512  → 物品重量
其中，关于物品重量取值的说明：

文件占用的软盘空间都是按块分配的，每个块大小为512个字节。一个块只能被一个文件使用。拷贝到软盘中的文件必须是完整的，且不能采取任何压缩技术。
这段话的意思是，比如一个文件的大小是513个字节，此时他需要占用软盘的容量不是513字节，而是需要占用两个块，即：2 * 512字节的大小。

但是最终该文件只有513字节大小。

另外，本题中，背包承重和物品重量可以将单位从：字节，优化为：块（512字节每块）

这样的话，可以降低dp数组的长度定义。

而物品的价值只能保持为字节，因为题目最后要求返回的是总字节大小。


 */
public class 通过软盘拷贝文件 {
    
    public static void main(String[] args) {
    
        try{
            Scanner scanner = new Scanner(System.in);

            //文件数量
            int fileCount = scanner.nextInt();
            int[] fileSizeArr = new int[fileCount];
            for(int i=0; i<fileCount; i++){
            

                fileSizeArr[i] = scanner.nextInt();



            }

            //背包数量
            int bag = 1474560 / 512;
            int[][] dp = new int[fileCount+1][bag+1];

            for(int i=1; i<=fileCount; i++){

                //物品重量
                int weight = (int)Math.ceil(fileSizeArr[i-1] / 512.0);
                //物品价值
                int value = fileSizeArr[i-1];

                for(int j=0; j<=bag; j++){

                    if(weight > j){
                        dp[i][j] = dp[i-1][j];
                    } else {

                        dp[i][j] = Math.max(dp[i-1][j], dp[i-1][j-weight] + value);
                    }
                }
            }


            System.out.println(dp[fileCount][bag]);


        }catch(Exception e){

            e.printStackTrace();
        }
    }
}
